package ve.usb.ddp;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.codec.GifImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.ddp.hibernate.*;

import java.util.List;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import org.hibernate.HibernateException;
import ve.usb.cohesion.runtime.LocalDate;

/**
 * 
 */
public class AccionesCU003ManejoPAI extends CohesionAction {
    
/**
     * Called by Struts for the execution of action A_Pre_BuscarProfesorPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_BuscarProfesorPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_BuscarProfesorPAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /* Empieza nuestro codigo */
            F_BuscarProfesor fF_BuscarProfesor = new F_BuscarProfesor();
            fF_BuscarProfesor.setVengoDe(request.getParameter("vengoDe"));
            request.getSession().setAttribute("F_BuscarProfesor", fF_BuscarProfesor);
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_AgregarResolucionPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_AgregarResolucionPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_AgregarResolucionPAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /* Comienza nuestro codigo */
            int ciProf = (Integer) request.getAttribute("ciProf");

            Profesor prof = null;
            String idProf = (String) request.getAttribute("idProf");
            if (idProf != null) {
                // hace forward del idProf
                request.setAttribute("idProf", idProf);
                prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));
            }

            F_ResolucionPai fF_ResolucionPai = new F_ResolucionPai();
            // De una vez coloco la cedula del profesor en el formulario
            fF_ResolucionPai.setCi(ciProf);
            if (prof != null) {
                /* Set de Datos Personales del Profesor */
                fF_ResolucionPai.setPrimerNombre(prof.getPrimerNombre());
                fF_ResolucionPai.setSegundoNombre(prof.getSegundoNombre());
                fF_ResolucionPai.setPrimerApellido(prof.getPrimerApellido());
                fF_ResolucionPai.setSegundoApellido(prof.getSegundoApellido());
                fF_ResolucionPai.setFechaNacimiento(prof.getFec_Nac().toString());
                fF_ResolucionPai.setCorreoElectronico(prof.getCorreo());

                /* Set de Datos Laborales del Profesor en la USB */
                fF_ResolucionPai.setFechaIngresoUsb(prof.getFec_Ing_USB().toString());
                if (prof.getFec_Renuncia() != null) {
                    fF_ResolucionPai.setFechaRenunciaUsb(prof.getFec_Renuncia().toString());
                }
                fF_ResolucionPai.setCategoria(prof.getCategoria());
                fF_ResolucionPai.setDivision(prof.getDivision());
                fF_ResolucionPai.setDepartamento(prof.getDepartamento());
                fF_ResolucionPai.setNovel(prof.getNovel());

                Pai paiActivo = prof.getPaiActivo();
                if (paiActivo != null) {
                    /* Set de Datos del Programa de Ayuda Institucional */
                    fF_ResolucionPai.setFechaIngresoPai(paiActivo.getFec_Ini().toString());
                    fF_ResolucionPai.setFechaFinalizacionPai(paiActivo.getFec_Fin().toString());
                    fF_ResolucionPai.setArticuloOcho(paiActivo.getArticulo8());
                    request.setAttribute("idPai", Long.toString(paiActivo.getIdPai()));
                    // TODO setear mensaje que SI hay pai activo para el profesor
                } else {
                    // TODO setear mensaje que NO hay pai activo para el profesor
                }

                request.getSession().setAttribute("L_Divisiones", prof.getDivisionesUSB());
                request.getSession().setAttribute("L_Departamentos", prof.getDepartamentosUSB());
                request.getSession().setAttribute("L_Categorias", prof.getCategoriasUSB());
            } else {
                request.setAttribute("idProf", "");
                request.setAttribute("idPai", "");
                /* TODO setear mensaje que NO existe el profesor 
                 en la base de datos y que se debe agregar en el formulario*/

                request.getSession().setAttribute("L_Divisiones", new Profesor().getDivisionesUSB());
                request.getSession().setAttribute("L_Departamentos", new Profesor().getDepartamentosUSB());
                request.getSession().setAttribute("L_Categorias", new Profesor().getCategoriasUSB());
            }

            String query = "SELECT DISTINCT fuente FROM PaiFuenteFinanciamiento";
            List<String> L_Fuentes_Financiamiento = s.createSQLQuery(query).list();
            request.getSession().setAttribute("L_Fuentes_Financiamiento", L_Fuentes_Financiamiento);

            query = "SELECT DISTINCT concepto FROM PaiRemuneracion";
            List<String> L_Remuneraciones_Conceptos = s.createSQLQuery(query).list();
            request.getSession().setAttribute("L_Remuneraciones_Conceptos", L_Remuneraciones_Conceptos);

            // Le envio el formulario seteado a la vista
            request.getSession().setAttribute("F_ResolucionPai", fF_ResolucionPai);
            request.getSession().setAttribute("L_Paises", fF_ResolucionPai.paisesLista());
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ModificarResolucionPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ModificarResolucionPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ModificarResolucionPAI", "A_Pre_BuscarProfesorPAI", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /* Comienza nuestro codigo */
            String idProf = (String) request.getAttribute("idProf");
            request.setAttribute("idProf", idProf);
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));

            Pai paiActivo = prof.getPaiActivo();
            if (paiActivo != null) {
                request.setAttribute("idPai", Long.toString(paiActivo.getIdPai()));

                F_ResolucionPai fF_ResolucionPai = new F_ResolucionPai();

                /* Set de Datos Personales del Profesor */
                fF_ResolucionPai.setPrimerNombre(prof.getPrimerNombre());
                fF_ResolucionPai.setSegundoNombre(prof.getSegundoNombre());
                fF_ResolucionPai.setPrimerApellido(prof.getPrimerApellido());
                fF_ResolucionPai.setSegundoApellido(prof.getSegundoApellido());
                fF_ResolucionPai.setCi(prof.getCi());
                fF_ResolucionPai.setFechaNacimiento(prof.getFec_Nac().toString());
                fF_ResolucionPai.setCorreoElectronico(prof.getCorreo());

                /* Set de Datos Laborales del Profesor en la USB */
                fF_ResolucionPai.setFechaIngresoUsb(prof.getFec_Ing_USB().toString());
                if (prof.getFec_Renuncia() != null) {
                    fF_ResolucionPai.setFechaRenunciaUsb(prof.getFec_Renuncia().toString());
                }
                fF_ResolucionPai.setCategoria(prof.getCategoria());
                fF_ResolucionPai.setDivision(prof.getDivision());
                fF_ResolucionPai.setDepartamento(prof.getDepartamento());
                fF_ResolucionPai.setNovel(prof.getNovel());

                /*************************************************************************
                 *                DATOS DEL REGISTRO PAI                                  *
                 *************************************************************************/
                fF_ResolucionPai.setFechaIngresoPai(paiActivo.getFec_Ini().toString());
                fF_ResolucionPai.setFechaFinalizacionPai(paiActivo.getFec_Fin().toString());
                fF_ResolucionPai.setArticuloOcho(paiActivo.getArticulo8());

                /*************************************************************************
                 *                DATOS DE LA RESOLUCION                                  *
                 *************************************************************************/
                String query = "SELECT res FROM PaiResolucion res "
                        + "WHERE res.pai = " + paiActivo.getId().toString()
                        + "ORDER BY res.fec_Resolucion DESC";
                PaiResolucion resolucion = (PaiResolucion) s.createQuery(query).list().get(0);
                request.setAttribute("idRes", resolucion.getId().toString());
                fF_ResolucionPai.setNumeroResolucion(resolucion.getNum_Resolucion());
                fF_ResolucionPai.setFechaResolucion(resolucion.getFec_Resolucion().toString());
                fF_ResolucionPai.setNumeroInformeDdp(resolucion.getNum_InformeDDP());

                /*************************************************************************
                 *                DATOS DE LOS ESTUDIOS                                   *
                 *************************************************************************/
                PaiEstudio estudio = resolucion.getEstudio();
                if (estudio != null) {
                    fF_ResolucionPai.setUniversidad(estudio.getUniversidad());
                    fF_ResolucionPai.setPais(estudio.getPais());
                    fF_ResolucionPai.setNivelEstudio(estudio.getNivel());
                    fF_ResolucionPai.setModalidadIngreso(estudio.getModalidad());
                    fF_ResolucionPai.setNombre_Estudio(estudio.getNombre_Estudio());
                    fF_ResolucionPai.setEstudioInicio(estudio.getFec_Ini().toString());
                    fF_ResolucionPai.setEstudioFin(estudio.getFec_Fin().toString());
                }

                /*************************************************************************
                 *                FIANZA                                                 *
                 *************************************************************************/
                PaiApoderado apoderado = resolucion.getApoderado();
                if (apoderado != null) {
                    fF_ResolucionPai.setApoderadoNombres(apoderado.getNombre());
                    fF_ResolucionPai.setApoderadoApellidos(apoderado.getApellido());
                    fF_ResolucionPai.setApoderadoCi(apoderado.getCi());
                    fF_ResolucionPai.setApoderadoTelefono(apoderado.getTelefono());
                    fF_ResolucionPai.setApoderadoCorreoElectronico(apoderado.getCorreo());
                }

                /*************************************************************************
                 *                REMUNERACIONES                                          *
                 *************************************************************************/

                for (PaiRemuneracion _remuneracion : resolucion.getSet_Remuneracion()) {
                    Hibernate.initialize(_remuneracion.getSet_FuenteFinanciamiento());
                }
                request.getSession().setAttribute("I_Remuneraciones", resolucion.getSet_Remuneracion());

                /*************************************************************************
                 *                ESTATUS DEL PROFESOR EN EL PAI                          *
                 *************************************************************************/
                for (PaiEstatus _paiEstatus : resolucion.getSet_Estatus()) {
                    if (_paiEstatus.getNombre().equals("aproboExamen")) {
                        /*Set estatus del profesor, Aprobó exámen calificador */
                        fF_ResolucionPai.setEstatusAproboExamen(true);
                    } else if (_paiEstatus.getNombre().equals("culminoCreditos")) {
                        /*Set estatus del profesor, culminó los créditos de las asignaturas */
                        fF_ResolucionPai.setEstatusCulminoCreditos(true);
                    } else if (_paiEstatus.getNombre().equals("desarrollandoTesis")) {
                        /*Set estatus del profesor, está desarrollando tesis */
                        fF_ResolucionPai.setEstatusDesarrollandoTesis(true);
                    } else if (_paiEstatus.getNombre().equals("culminoEstudios")) {
                        /*Set estatus del profesor, culminó los estudios */
                        fF_ResolucionPai.setEstatusCulminoEstudios(true);
                    }
                }

                /*************************************************************************
                 *               Renovación de Permiso Remunerado                        *
                 *************************************************************************/
                PaiPermisoRemunerado permisoRemunerado = resolucion.getPermisoRemunerado();
                if (permisoRemunerado != null) {
                    fF_ResolucionPai.setPerRemuneradoFechaInicio(permisoRemunerado.getFechaInicio().toString());
                    fF_ResolucionPai.setPerRemuneradoFechaFin(permisoRemunerado.getFechaFin().toString());
                    fF_ResolucionPai.setPerRemuneradoDescripcion(permisoRemunerado.getDescripcion());
                }

                /*************************************************************************
                 *               Renovación de Permiso No Remunerado                      *
                 *************************************************************************/
                PaiPermisoNoRemunerado permisoNoRemunerado = resolucion.getPermisoNoRemunerado();
                if (permisoNoRemunerado != null) {
                    fF_ResolucionPai.setPerNoRemEntregoInforme(permisoNoRemunerado.getInforme_entregado());
                    fF_ResolucionPai.setPerNoRemOtorgaRenovacion(permisoNoRemunerado.getOtorgado());
                    fF_ResolucionPai.setPerNoRemFechaInicio(permisoNoRemunerado.getFec_Inicio().toString());
                    fF_ResolucionPai.setPerNoRemFechaVencimiento(permisoNoRemunerado.getFec_Vencimiento().toString());
                    fF_ResolucionPai.setPerNoRemDescripcion(permisoNoRemunerado.getDescripcion());
                }

                /*************************************************************************
                 *               Solicitud de Prórroga                                    *
                 *************************************************************************/
                PaiProrroga prorroga = resolucion.getProrroga();
                if (prorroga != null) {
                    fF_ResolucionPai.setProrrogaSeOtorga(prorroga.getOtorgado());
                    fF_ResolucionPai.setProrrogaInicio(prorroga.getFec_Ini().toString());
                    fF_ResolucionPai.setProrrogaFin(prorroga.getFec_Fin().toString());
                }

                /*************************************************************************
                 *               Reintegro de un Profesor a la USB                        *
                 *************************************************************************/
                PaiReintegro reintegro = resolucion.getReintegro();
                if (reintegro != null) {
                    fF_ResolucionPai.setReintegroFecha(reintegro.getFec_reintegro().toString());
                }

                /*************************************************************************
                 *               Renuncia a la Manuntención por la USB                    *
                 *************************************************************************/
                PaiRenunciaManutencion renunciaManutencion = resolucion.getRenunciaManutencion();
                if (renunciaManutencion != null) {
                    fF_ResolucionPai.setMontoAnterior(renunciaManutencion.getMonto_Anterior());
                    fF_ResolucionPai.setMonedaAnterior(renunciaManutencion.getMoneda_Anterior());
                    fF_ResolucionPai.setNuevoMonto(renunciaManutencion.getNuevo_Monto());
                    fF_ResolucionPai.setNuevaMoneda(renunciaManutencion.getNueva_Moneda());
                }

                /*************************************************************************
                 *               Desincorporacion                                        *
                 *************************************************************************/
                PaiDesincorporacion desincorporacion = resolucion.getDesincorporacion();
                if (desincorporacion != null) {
                    fF_ResolucionPai.setDesincorporacionFecha(desincorporacion.getFecha().toString());
                    fF_ResolucionPai.setDesincorporacionRazon(desincorporacion.getRazon());
                }

                query = "SELECT DISTINCT fuente FROM PaiFuenteFinanciamiento";
                List<String> L_Fuentes_Financiamiento = s.createSQLQuery(query).list();
                request.getSession().setAttribute("L_Fuentes_Financiamiento", L_Fuentes_Financiamiento);

                query = "SELECT DISTINCT concepto FROM PaiRemuneracion";
                List<String> L_Remuneraciones_Conceptos = s.createSQLQuery(query).list();
                request.getSession().setAttribute("L_Remuneraciones_Conceptos", L_Remuneraciones_Conceptos);

                // Le envio el formulario seteado a la vista
                request.getSession().setAttribute("F_ResolucionPai", fF_ResolucionPai);
                request.getSession().setAttribute("L_Categorias", prof.getCategoriasUSB());
                request.getSession().setAttribute("L_Divisiones", prof.getDivisionesUSB());
                request.getSession().setAttribute("L_Departamentos", prof.getDepartamentosUSB());
                request.getSession().setAttribute("L_Paises", fF_ResolucionPai.paisesLista());
            } else {
                salida = SALIDA_1;
                request.setAttribute("vengoDe", "MODIFICAR_RESOLUCION");
            }
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ModificarResolucionPAI.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ModificarProfesorPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ModificarProfesorPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ModificarProfesorPAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /* Comienza nuestro codigo */
            String idProf = (String) request.getAttribute("idProf");
            request.setAttribute("idProf", idProf);
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));

            F_DatosProfesor fF_DatosProfesor = new F_DatosProfesor();
            // De una vez coloco la cedula del profesor en el formulario
            fF_DatosProfesor.setCi(prof.getCi());
            if (prof != null) {
                /* Set de Datos Personales del Profesor */
                fF_DatosProfesor.setPrimerNombre(prof.getPrimerNombre());
                fF_DatosProfesor.setSegundoNombre(prof.getSegundoNombre());
                fF_DatosProfesor.setPrimerApellido(prof.getPrimerApellido());
                fF_DatosProfesor.setSegundoApellido(prof.getSegundoApellido());
                fF_DatosProfesor.setFecha_Nacimiento(prof.getFec_Nac().toString());
                fF_DatosProfesor.setCorreo(prof.getCorreo());

                /* Set de Datos Laborales del Profesor en la USB */
                fF_DatosProfesor.setFecha_Ingreso_USB(prof.getFec_Ing_USB().toString());
                if (prof.getFec_Renuncia() != null) {
                    fF_DatosProfesor.setFecha_Renuncia_USB(prof.getFec_Renuncia().toString());
                }
                fF_DatosProfesor.setCategoria(prof.getCategoria());
                fF_DatosProfesor.setDivision(prof.getDivision());
                fF_DatosProfesor.setDepartamento(prof.getDepartamento());
                fF_DatosProfesor.setNovel(prof.getNovel());
            }

            // Le envio el formulario seteado a la vista
            request.getSession().setAttribute("F_DatosProfesor", fF_DatosProfesor);
            request.getSession().setAttribute("L_Categorias", prof.getCategoriasUSB());
            request.getSession().setAttribute("L_Divisiones", prof.getDivisionesUSB());
            request.getSession().setAttribute("L_Departamentos", prof.getDepartamentosUSB());
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ObservacionesPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ObservacionesPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ObservacionesPAI", "A_Pre_BuscarProfesorPAI", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
             /* Comienza nuestro codigo */
            String idProf = (String) request.getAttribute("idProf");
            request.setAttribute("idProf", idProf);
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));
            F_Observacion fF_Observacion = new F_Observacion();
            fF_Observacion.setFechaObservacion(new LocalDate(new Date()).toString());
            Pai paiActivo = prof.getPaiActivo();
            if (paiActivo != null) {
                String query = "FROM Observacion_Pai obs WHERE obs.pai=:idpai " +
                        "ORDER BY obs.fecha DESC";
                List<Observacion_Pai> L_Obs = s.createQuery(query)
                        .setLong("idpai", paiActivo.getIdPai()).list();
                request.setAttribute("L_Obs", L_Obs);
                request.setAttribute("Profesor", prof);
                salida = SALIDA_0;
            } else {
                salida = SALIDA_1;
                request.setAttribute("vengoDe", "OBSERVACIONES");
                request.getSession().setAttribute("F_Observacion", fF_Observacion);
            }
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ObservacionesPAI.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_BuscarProfesorPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_BuscarProfesorPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_BuscarProfesorPAI", "A_Pre_AgregarResolucionPAI", "A_Pre_ModificarResolucionPAI", "A_Pre_ModificarProfesorPAI", "A_Pre_ObservacionesPAI", "A_Pre_ConsultaAvanzadaPAI", "A_Pre_RegistrarPagoPAI", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;
        final int SALIDA_2 = 2;
        final int SALIDA_3 = 3;
        final int SALIDA_4 = 4;
        final int SALIDA_5 = 5;
        final int SALIDA_6 = 6;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_BuscarProfesor fF_BuscarProfesor = (F_BuscarProfesor)form;
           /* Comienza nuestro codigo */
            String vengoDe = fF_BuscarProfesor.getVengoDe();

            List<Profesor> profs = s.createQuery("FROM Profesor prof WHERE prof.ci=:ci")
                    .setInteger("ci", fF_BuscarProfesor.getCi()).list();
            if (profs.size() == 1) {
                request.setAttribute("idProf", Long.toString(profs.get(0).getIdProfesor()));
                // Condiciones de salida
                if (vengoDe.equals("MODIFICAR_RESOLUCION")) {
                    // Salida Exitosa para Modificar Resolucion.
                    salida = SALIDA_2;
                } else if (vengoDe.equals("MODIFICAR_PROFESOR")) {
                    // Salida Exitosa para Modificar Profesor.
                    salida = SALIDA_3;
                } else if(vengoDe.equals("OBSERVACIONES")) {
                    // Salida Exitosa para Observaciones. 
                    salida = SALIDA_4;
                } else if(vengoDe.equals("CONSULTA_AVANZADA")) {
                    salida = SALIDA_5;
                } else if(vengoDe.equals("REGISTRAR_PAGO")) {
                    salida = SALIDA_6;
                }
            } else {
                // No se encontro al profesor.
                salida = SALIDA_0;
                request.setAttribute("vengoDe", vengoDe);
            }
            
            // Condicion para Agregar Resolucion es independiente de las demas
            if (vengoDe.equals("AGREGAR_RESOLUCION")) {
                // Siempre se va a la vista V_AgregarResolucionPAI
                // sin importar si se consigue o no al profesor.
                salida = SALIDA_1;
                // Le envio la cedula del profesor a AgregarResolucion
                // para cuando el profesor es nuevo en el sistema
                request.setAttribute("ciProf", fF_BuscarProfesor.getCi());
            }
            // Limpio el formulario
            fF_BuscarProfesor.reset(mapping, request);
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_BuscarProfesorPAI.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_AgregarResolucionPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_AgregarResolucionPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_ResolucionPai fF_ResolucionPai = (F_ResolucionPai)form;
            /* Comienza nuestro codigo */
            Profesor prof;
            String idProf = (String) request.getParameter("idProf");
            if (idProf.equals("")) {
                prof = new Profesor();
            } else {
                prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));
            }
            /* Set de Datos Personales del Profesor */
            prof.setPrimerNombre(fF_ResolucionPai.getPrimerNombre());
            prof.setSegundoNombre(fF_ResolucionPai.getSegundoNombre());
            prof.setPrimerApellido(fF_ResolucionPai.getPrimerApellido());
            prof.setSegundoApellido(fF_ResolucionPai.getSegundoApellido());
            prof.setCi(fF_ResolucionPai.getCi());
            prof.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaNacimiento()));
            prof.setCorreo(fF_ResolucionPai.getCorreoElectronico());
            /* Set de Datos Laborales del Profesor en la USB */
            prof.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaIngresoUsb()));
            prof.setFec_Renuncia(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaRenunciaUsb()));
            prof.setCategoria(fF_ResolucionPai.getCategoria());
            prof.setDivision(fF_ResolucionPai.getDivision());
            prof.setDepartamento(fF_ResolucionPai.getDepartamento());
            prof.setNovel(fF_ResolucionPai.getNovel());
            s.saveOrUpdate(prof);

            /*************************************************************************
            *                DATOS DEL REGISTRO PAI                                  *
            *************************************************************************/

            Pai paiActivo;
            String idPai = (String) request.getParameter("idPai");
            if (idPai.equals("")) {
                paiActivo = new Pai();
                prof.addToSet_Pai(paiActivo);
            } else {
                paiActivo = (Pai) s.load(Pai.class, Long.parseLong(idPai));
            }
            /* Set de Datos del Programa de Ayuda Institucional */
            paiActivo.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaIngresoPai()));
            paiActivo.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaFinalizacionPai()));
            paiActivo.setArticulo8(fF_ResolucionPai.getArticuloOcho());
            s.saveOrUpdate(paiActivo);

            /*************************************************************************
            *                DATOS DE LA RESOLUCION                                  *
            *************************************************************************/

            PaiResolucion resolucion = new PaiResolucion();
            paiActivo.addToSet_Resolucion(resolucion);
            resolucion.setNum_Resolucion(fF_ResolucionPai.getNumeroResolucion());
            resolucion.setFec_Resolucion(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaResolucion()));
            resolucion.setNum_InformeDDP(fF_ResolucionPai.getNumeroInformeDdp());
            s.save(resolucion);

            /*************************************************************************
            *                DATOS DE LOS ESTUDIOS                                   *
            *************************************************************************/
            if (!fF_ResolucionPai.getUniversidad().equals("")) {
                PaiEstudio estudio = new PaiEstudio();
                estudio.setResolucion(resolucion);
                resolucion.setEstudio(estudio);
                estudio.setUniversidad(fF_ResolucionPai.getUniversidad());
                estudio.setPais(fF_ResolucionPai.getPais());
                estudio.setNombre_Estudio(fF_ResolucionPai.getNombre_Estudio());
                estudio.setNivel(fF_ResolucionPai.getNivelEstudio());
                estudio.setModalidad(fF_ResolucionPai.getModalidadIngreso());
                estudio.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getEstudioInicio()));
                estudio.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getEstudioFin()));
                s.save(estudio);
            }

            /*************************************************************************
            *                           FIANZA                                       *
            *************************************************************************/
            if (!fF_ResolucionPai.getApoderadoNombres().equals("")) {
                PaiApoderado apoderado = new PaiApoderado();
                apoderado.setResolucion(resolucion);
                resolucion.setApoderado(apoderado);
                apoderado.setNombre(fF_ResolucionPai.getApoderadoNombres());
                apoderado.setApellido(fF_ResolucionPai.getApoderadoApellidos());
                apoderado.setCi(fF_ResolucionPai.getApoderadoCi());
                apoderado.setTelefono(fF_ResolucionPai.getApoderadoTelefono());
                apoderado.setCorreo(fF_ResolucionPai.getApoderadoCorreoElectronico());
                s.save(apoderado);
            }

            /*************************************************************************
            *                REMUNERACIONES                                          *
            *************************************************************************/

            String[] remConceptos = fF_ResolucionPai.getRemuneracionConcepto();
            String[] remFrecuencias = fF_ResolucionPai.getRemuneracionFrecuencia();
            String[] remFechasInicio = fF_ResolucionPai.getRemuneracionFechaInicio();
            String[] remFechasFin = fF_ResolucionPai.getRemuneracionFechaFin();
            String[] remTipos = fF_ResolucionPai.getRemuneracionTipoFinanciamiento();
            String[] remNumFuentes = fF_ResolucionPai.getRemuneracionNumFuentesFinanciamiento();

            String[] fuentes = fF_ResolucionPai.getFuenteFinanciamiento();
            String[] fuenteMontos = fF_ResolucionPai.getFuenteFinanciamientoMonto();
            String[] fuenteMonedas = fF_ResolucionPai.getFuenteFinanciamientoMoneda();
            int contadorFuentes = 0;

            if (remConceptos != null) {
                for (int i = 0; i < remConceptos.length; i++) {
                    PaiRemuneracion nuevaRem = new PaiRemuneracion();
                    resolucion.addToSet_Remuneracion(nuevaRem);
                    nuevaRem.setConcepto(remConceptos[i]);
                    nuevaRem.setFrecuencia(remFrecuencias[i]);
                    nuevaRem.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(remFechasInicio[i]));
                    if (!remFechasFin[i].equals("")) {
                        nuevaRem.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(remFechasFin[i]));
                    }
                    nuevaRem.setTipoFinanciamiento(remTipos[i]);
                    s.save(nuevaRem);

                    int cantFuentes = Integer.parseInt(remNumFuentes[i]);

                    for (int j = 0; j < cantFuentes; j++) {
                        PaiFuenteFinanciamiento nuevaFuente = new PaiFuenteFinanciamiento();
                        nuevaRem.addToSet_FuenteFinanciamiento(nuevaFuente);
                        nuevaFuente.setFuente(fuentes[contadorFuentes]);
                        nuevaFuente.setMonto(Integer.parseInt(fuenteMontos[contadorFuentes]));
                        nuevaFuente.setMoneda(fuenteMonedas[contadorFuentes]);
                        s.save(nuevaFuente);
                        contadorFuentes++;
                    }
                }
            }

            /*************************************************************************
            *                ESTATUS DEL PROFESOR EN EL PAI                          *
            *************************************************************************/

             /*Set estatus del profesor, Aprobó exámen calificador */
            if (fF_ResolucionPai.getEstatusAproboExamen()){
                PaiEstatus aproboExamen = new PaiEstatus();
                resolucion.addToSet_Estatus(aproboExamen);
                aproboExamen.setNombre("aproboExamen");
                s.save(aproboExamen);
            }

            /*Set estatus del profesor, culminó los créditos de las asignaturas */
            if (fF_ResolucionPai.getEstatusCulminoCreditos()){
                PaiEstatus culminoCreditos = new PaiEstatus();
                resolucion.addToSet_Estatus(culminoCreditos);
                culminoCreditos.setNombre("culminoCreditos");
                s.save(culminoCreditos);
            }

            /*Set estatus del profesor, está desarrollando tesis */
            if (fF_ResolucionPai.getEstatusDesarrollandoTesis()){
                PaiEstatus desarrollandoTesis = new PaiEstatus();
                resolucion.addToSet_Estatus(desarrollandoTesis);
                desarrollandoTesis.setNombre("desarrollandoTesis");
                s.save(desarrollandoTesis);
            }

              /*Set estatus del profesor, culminó los estudios */
            if (fF_ResolucionPai.getEstatusCulminoEstudios()){
                PaiEstatus culminoEstudios = new PaiEstatus();
                resolucion.addToSet_Estatus(culminoEstudios);
                culminoEstudios.setNombre("culminoEstudios");
                s.save(culminoEstudios);
            }

            /*************************************************************************
            *               Renovación de Permiso Remunerado                         *
            *************************************************************************/
            if (!fF_ResolucionPai.getPerRemuneradoDescripcion().equals("")) {
                PaiPermisoRemunerado permisoRemunerado = new PaiPermisoRemunerado();
                permisoRemunerado.setResolucion(resolucion);
                resolucion.setPermisoRemunerado(permisoRemunerado);
                permisoRemunerado.setFechaInicio(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerRemuneradoFechaInicio()));
                permisoRemunerado.setFechaFin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerRemuneradoFechaFin()));
                permisoRemunerado.setDescripcion(fF_ResolucionPai.getPerRemuneradoDescripcion());
                s.save(permisoRemunerado);
            }

            /*************************************************************************
            *               Renovación de Permiso No Remunerado                      *
            *************************************************************************/
            if (!fF_ResolucionPai.getPerNoRemDescripcion().equals("")) {
                PaiPermisoNoRemunerado permisoNoRemunerado = new PaiPermisoNoRemunerado();
                permisoNoRemunerado.setResolucion(resolucion);
                resolucion.setPermisoNoRemunerado(permisoNoRemunerado);
                permisoNoRemunerado.setInforme_entregado(fF_ResolucionPai.getPerNoRemEntregoInforme());
                permisoNoRemunerado.setOtorgado(fF_ResolucionPai.getPerNoRemOtorgaRenovacion());
                permisoNoRemunerado.setFec_Inicio(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerNoRemFechaInicio()));
                permisoNoRemunerado.setFec_Vencimiento(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerNoRemFechaVencimiento()));
                permisoNoRemunerado.setDescripcion(fF_ResolucionPai.getPerNoRemDescripcion());
                s.save(permisoNoRemunerado);
            }

            /*************************************************************************
            *               Solicitud de Prórroga                                    *
            *************************************************************************/
            if (!fF_ResolucionPai.getProrrogaInicio().equals("")) {
                PaiProrroga prorroga = new PaiProrroga();
                prorroga.setResolucion(resolucion);
                resolucion.setProrroga(prorroga);
                prorroga.setOtorgado(fF_ResolucionPai.getProrrogaSeOtorga());
                prorroga.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getProrrogaInicio()));
                prorroga.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getProrrogaFin()));
                s.save(prorroga);
            }

            /*************************************************************************
            *               Reintegro de un Profesor a la USB                        *
            *************************************************************************/
            if (!fF_ResolucionPai.getReintegroFecha().equals("")) {
                PaiReintegro reintegro = new PaiReintegro();
                reintegro.setResolucion(resolucion);
                resolucion.setReintegro(reintegro);
                reintegro.setFec_reintegro(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getReintegroFecha()));
                s.save(reintegro);
            }

            /*************************************************************************
            *               Renuncia a la Manuntención por la USB                    *
            *************************************************************************/
            if (!fF_ResolucionPai.getMonedaAnterior().equals("")) {
                PaiRenunciaManutencion renunciaManutencion = new PaiRenunciaManutencion();
                renunciaManutencion.setResolucion(resolucion);
                resolucion.setRenunciaManutencion(renunciaManutencion);
                renunciaManutencion.setMonto_Anterior(fF_ResolucionPai.getMontoAnterior());
                renunciaManutencion.setMoneda_Anterior(fF_ResolucionPai.getMonedaAnterior());
                renunciaManutencion.setNuevo_Monto(fF_ResolucionPai.getNuevoMonto());
                renunciaManutencion.setNueva_Moneda(fF_ResolucionPai.getNuevaMoneda());
                s.save(renunciaManutencion);
            }

            /*************************************************************************
            *                           Desincorporacion                             *
            *************************************************************************/
            if (!fF_ResolucionPai.getDesincorporacionRazon().equals("")) {
                PaiDesincorporacion desincorporacion = new PaiDesincorporacion();
                desincorporacion.setResolucion(resolucion);
                resolucion.setDesincorporacion(desincorporacion);
                desincorporacion.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getDesincorporacionFecha()));
                desincorporacion.setRazon(fF_ResolucionPai.getDesincorporacionRazon());
                s.save(desincorporacion);
            }

            /*************************************************************************
            *               Nueva Observacion                                        *
            *************************************************************************/

            if (!fF_ResolucionPai.getObservacionTexto().equals("")) {
                Observacion_Pai obs = new Observacion_Pai();
                paiActivo.addToSet_Observacion_Pai(obs);
                obs.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getObservacionFecha()));
                obs.setTexto(fF_ResolucionPai.getObservacionTexto());
                s.save(obs);
            }
            // Limpio el formulario
            fF_ResolucionPai.reset(mapping, request);
            // Limpio la session de hibernate
            s.flush();
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_AgregarResolucionPAI.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_ModificarResolucionPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_ModificarResolucionPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors director_DDP, encargado_pai
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_ResolucionPai fF_ResolucionPai = (F_ResolucionPai)form;
            /* Comienza nuestro codigo */
            String idProf = (String) request.getParameter("idProf");
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));
            /* Set de Datos Personales del Profesor */
            prof.setPrimerNombre(fF_ResolucionPai.getPrimerNombre());
            prof.setSegundoNombre(fF_ResolucionPai.getSegundoNombre());
            prof.setPrimerApellido(fF_ResolucionPai.getPrimerApellido());
            prof.setSegundoApellido(fF_ResolucionPai.getSegundoApellido());
            prof.setCi(fF_ResolucionPai.getCi());
            prof.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaNacimiento()));
            prof.setCorreo(fF_ResolucionPai.getCorreoElectronico());
            /* Set de Datos Laborales del Profesor en la USB */
            prof.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaIngresoUsb()));
            prof.setFec_Renuncia(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaRenunciaUsb()));
            prof.setCategoria(fF_ResolucionPai.getCategoria());
            prof.setDivision(fF_ResolucionPai.getDivision());
            prof.setDepartamento(fF_ResolucionPai.getDepartamento());
            prof.setNovel(fF_ResolucionPai.getNovel());
            s.update(prof);

            /*************************************************************************
            *                DATOS DEL REGISTRO PAI                                  *
            *************************************************************************/

            String idPai = (String) request.getParameter("idPai");
            Pai paiActivo = (Pai) s.load(Pai.class, Long.parseLong(idPai));
            /* Set de Datos del Programa de Ayuda Institucional */
            paiActivo.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaIngresoPai()));
            paiActivo.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaFinalizacionPai()));
            paiActivo.setArticulo8(fF_ResolucionPai.getArticuloOcho());
            s.update(paiActivo);

            /*************************************************************************
            *                DATOS DE LA RESOLUCION                                  *
            *************************************************************************/

            String idRes = (String) request.getParameter("idRes");
            PaiResolucion resolucion = (PaiResolucion) s.load(PaiResolucion.class, Long.parseLong(idRes));
            resolucion.setNum_Resolucion(fF_ResolucionPai.getNumeroResolucion());
            resolucion.setFec_Resolucion(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getFechaResolucion()));
            resolucion.setNum_InformeDDP(fF_ResolucionPai.getNumeroInformeDdp());
            s.update(resolucion);

            /*************************************************************************
            *                DATOS DE LOS ESTUDIOS                                   *
            *************************************************************************/
            PaiEstudio estudio = resolucion.getEstudio();
            if (!fF_ResolucionPai.getUniversidad().equals("")) {
                if (estudio == null) {
                    estudio = new PaiEstudio();
                    estudio.setResolucion(resolucion);
                    resolucion.setEstudio(estudio);
                }
                estudio.setUniversidad(fF_ResolucionPai.getUniversidad());
                estudio.setPais(fF_ResolucionPai.getPais());
                estudio.setNombre_Estudio(fF_ResolucionPai.getNombre_Estudio());
                estudio.setNivel(fF_ResolucionPai.getNivelEstudio());
                estudio.setModalidad(fF_ResolucionPai.getModalidadIngreso());
                estudio.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getEstudioInicio()));
                estudio.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getEstudioFin()));
                s.saveOrUpdate(estudio);
            } else if (fF_ResolucionPai.getUniversidad().equals("") && (estudio != null)) {
                resolucion.setEstudio(null);
                s.delete(estudio);
            }

            /*************************************************************************
            *                           FIANZA                                       *
            *************************************************************************/
            PaiApoderado apoderado = resolucion.getApoderado();
            if (!fF_ResolucionPai.getApoderadoNombres().equals("")) {
                if (apoderado == null) {
                    apoderado = new PaiApoderado();
                    apoderado.setResolucion(resolucion);
                    resolucion.setApoderado(apoderado);
                }
                apoderado.setNombre(fF_ResolucionPai.getApoderadoNombres());
                apoderado.setApellido(fF_ResolucionPai.getApoderadoApellidos());
                apoderado.setCi(fF_ResolucionPai.getApoderadoCi());
                apoderado.setTelefono(fF_ResolucionPai.getApoderadoTelefono());
                apoderado.setCorreo(fF_ResolucionPai.getApoderadoCorreoElectronico());
                s.saveOrUpdate(apoderado);
            } else if (fF_ResolucionPai.getApoderadoNombres().equals("") && (apoderado != null)) {
                resolucion.setApoderado(null);
                s.delete(apoderado);
            }

            /*************************************************************************
            *                REMUNERACIONES                                          *
            *************************************************************************/

            // Pirata pero funciona, mejorar en un futuro...
            resolucion.getSet_Remuneracion().clear();

            String[] remConceptos = fF_ResolucionPai.getRemuneracionConcepto();
            String[] remFrecuencias = fF_ResolucionPai.getRemuneracionFrecuencia();
            String[] remFechasInicio = fF_ResolucionPai.getRemuneracionFechaInicio();
            String[] remFechasFin = fF_ResolucionPai.getRemuneracionFechaFin();
            String[] remTipos = fF_ResolucionPai.getRemuneracionTipoFinanciamiento();
            String[] remNumFuentes = fF_ResolucionPai.getRemuneracionNumFuentesFinanciamiento();

            String[] fuentes = fF_ResolucionPai.getFuenteFinanciamiento();
            String[] fuenteMontos = fF_ResolucionPai.getFuenteFinanciamientoMonto();
            String[] fuenteMonedas = fF_ResolucionPai.getFuenteFinanciamientoMoneda();
            int contadorFuentes = 0;

            if (remConceptos != null) {
                for (int i = 0; i < remConceptos.length; i++) {
                    PaiRemuneracion nuevaRem = new PaiRemuneracion();
                    resolucion.addToSet_Remuneracion(nuevaRem);
                    nuevaRem.setConcepto(remConceptos[i]);
                    nuevaRem.setFrecuencia(remFrecuencias[i]);
                    nuevaRem.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(remFechasInicio[i]));
                    if (!remFechasFin[i].equals("")) {
                        nuevaRem.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(remFechasFin[i]));
                    }
                    nuevaRem.setTipoFinanciamiento(remTipos[i]);
                    s.save(nuevaRem);

                    int cantFuentes = Integer.parseInt(remNumFuentes[i]);

                    for (int j = 0; j < cantFuentes; j++) {
                        PaiFuenteFinanciamiento nuevaFuente = new PaiFuenteFinanciamiento();
                        nuevaRem.addToSet_FuenteFinanciamiento(nuevaFuente);
                        nuevaFuente.setFuente(fuentes[contadorFuentes]);
                        nuevaFuente.setMonto(Integer.parseInt(fuenteMontos[contadorFuentes]));
                        nuevaFuente.setMoneda(fuenteMonedas[contadorFuentes]);
                        s.save(nuevaFuente);
                        contadorFuentes++;
                    }
                }
            }

            /*************************************************************************
            *                ESTATUS DEL PROFESOR EN EL PAI                          *
            *************************************************************************/

            // Pirata pero funciona, mejorar en un futuro...
            resolucion.getSet_Estatus().clear();
             /*Set estatus del profesor, Aprobó exámen calificador */
            if (fF_ResolucionPai.getEstatusAproboExamen()){
                PaiEstatus aproboExamen = new PaiEstatus();
                resolucion.addToSet_Estatus(aproboExamen);
                aproboExamen.setNombre("aproboExamen");
                s.save(aproboExamen);
            }

            /*Set estatus del profesor, culminó los créditos de las asignaturas */
            if (fF_ResolucionPai.getEstatusCulminoCreditos()){
                PaiEstatus culminoCreditos = new PaiEstatus();
                resolucion.addToSet_Estatus(culminoCreditos);
                culminoCreditos.setNombre("culminoCreditos");
                s.save(culminoCreditos);
            }

            /*Set estatus del profesor, está desarrollando tesis */
            if (fF_ResolucionPai.getEstatusDesarrollandoTesis()){
                PaiEstatus desarrollandoTesis = new PaiEstatus();
                resolucion.addToSet_Estatus(desarrollandoTesis);
                desarrollandoTesis.setNombre("desarrollandoTesis");
                s.save(desarrollandoTesis);
            }

              /*Set estatus del profesor, culminó los estudios */
            if (fF_ResolucionPai.getEstatusCulminoEstudios()){
                PaiEstatus culminoEstudios = new PaiEstatus();
                resolucion.addToSet_Estatus(culminoEstudios);
                culminoEstudios.setNombre("culminoEstudios");
                s.save(culminoEstudios);
            }

            /*************************************************************************
            *               Renovación de Permiso Remunerado                         *
            *************************************************************************/
            PaiPermisoRemunerado permisoRemunerado = resolucion.getPermisoRemunerado();
            if (!fF_ResolucionPai.getPerRemuneradoDescripcion().equals("")) {
                if (permisoRemunerado == null) {
                    permisoRemunerado = new PaiPermisoRemunerado();
                    permisoRemunerado.setResolucion(resolucion);
                    resolucion.setPermisoRemunerado(permisoRemunerado);
                }
                permisoRemunerado.setFechaInicio(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerRemuneradoFechaInicio()));
                permisoRemunerado.setFechaFin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerRemuneradoFechaFin()));
                permisoRemunerado.setDescripcion(fF_ResolucionPai.getPerRemuneradoDescripcion());
                s.saveOrUpdate(permisoRemunerado);
            } else if (fF_ResolucionPai.getPerRemuneradoDescripcion().equals("") && (permisoRemunerado != null)) {
                resolucion.setPermisoRemunerado(null);
                s.delete(permisoRemunerado);
            }

            /*************************************************************************
            *               Renovación de Permiso No Remunerado                      *
            *************************************************************************/
            PaiPermisoNoRemunerado permisoNoRemunerado = resolucion.getPermisoNoRemunerado();
            if (!fF_ResolucionPai.getPerNoRemDescripcion().equals("")) {
                if (permisoNoRemunerado == null) {
                    permisoNoRemunerado = new PaiPermisoNoRemunerado();
                    permisoNoRemunerado.setResolucion(resolucion);
                    resolucion.setPermisoNoRemunerado(permisoNoRemunerado);
                }
                permisoNoRemunerado.setInforme_entregado(fF_ResolucionPai.getPerNoRemEntregoInforme());
                permisoNoRemunerado.setOtorgado(fF_ResolucionPai.getPerNoRemOtorgaRenovacion());
                permisoNoRemunerado.setFec_Inicio(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerNoRemFechaInicio()));
                permisoNoRemunerado.setFec_Vencimiento(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getPerNoRemFechaVencimiento()));
                permisoNoRemunerado.setDescripcion(fF_ResolucionPai.getPerNoRemDescripcion());
                s.saveOrUpdate(permisoNoRemunerado);
            } else if (fF_ResolucionPai.getPerNoRemDescripcion().equals("") && (permisoNoRemunerado != null)) {
                resolucion.setPermisoNoRemunerado(null);
                s.delete(permisoNoRemunerado);
            }

            /*************************************************************************
            *               Solicitud de Prórroga                                    *
            *************************************************************************/
            PaiProrroga prorroga = resolucion.getProrroga();
            if (!fF_ResolucionPai.getProrrogaInicio().equals("")) {
                if (prorroga == null) {
                    prorroga = new PaiProrroga();
                    prorroga.setResolucion(resolucion);
                    resolucion.setProrroga(prorroga);
                }
                prorroga.setOtorgado(fF_ResolucionPai.getProrrogaSeOtorga());
                prorroga.setFec_Ini(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getProrrogaInicio()));
                prorroga.setFec_Fin(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getProrrogaFin()));
                s.saveOrUpdate(prorroga);
            } else if (fF_ResolucionPai.getProrrogaInicio().equals("") && (prorroga != null)) {
                resolucion.setProrroga(null);
                s.delete(prorroga);
            }

            /*************************************************************************
            *               Reintegro de un Profesor a la USB                        *
            *************************************************************************/
            PaiReintegro reintegro = resolucion.getReintegro();
            if (!fF_ResolucionPai.getReintegroFecha().equals("")) {
                if (reintegro == null) {
                    reintegro = new PaiReintegro();
                    reintegro.setResolucion(resolucion);
                    resolucion.setReintegro(reintegro);
                }
                reintegro.setFec_reintegro(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getReintegroFecha()));
                s.saveOrUpdate(reintegro);
            } else if (fF_ResolucionPai.getReintegroFecha().equals("") && (reintegro != null)) {
                resolucion.setReintegro(null);
                s.delete(reintegro);
            }

            /*************************************************************************
            *               Renuncia a la Manuntención por la USB                    *
            *************************************************************************/
            PaiRenunciaManutencion renunciaManutencion = resolucion.getRenunciaManutencion();
            if (!fF_ResolucionPai.getMonedaAnterior().equals("")) {
                if (renunciaManutencion == null) {
                    renunciaManutencion = new PaiRenunciaManutencion();
                    renunciaManutencion.setResolucion(resolucion);
                    resolucion.setRenunciaManutencion(renunciaManutencion);
                }
                renunciaManutencion.setMonto_Anterior(fF_ResolucionPai.getMontoAnterior());
                renunciaManutencion.setMoneda_Anterior(fF_ResolucionPai.getMonedaAnterior());
                renunciaManutencion.setNuevo_Monto(fF_ResolucionPai.getNuevoMonto());
                renunciaManutencion.setNueva_Moneda(fF_ResolucionPai.getNuevaMoneda());
                s.saveOrUpdate(renunciaManutencion);
            } else if (fF_ResolucionPai.getMonedaAnterior().equals("") && (renunciaManutencion != null)) {
                resolucion.setRenunciaManutencion(null);
                s.delete(renunciaManutencion);
            }

            /*************************************************************************
            *                           Desincorporacion                             *
            *************************************************************************/
            PaiDesincorporacion desincorporacion = resolucion.getDesincorporacion();
            if (!fF_ResolucionPai.getDesincorporacionRazon().equals("")) {
                if (desincorporacion == null) {
                    desincorporacion = new PaiDesincorporacion();
                    desincorporacion.setResolucion(resolucion);
                    resolucion.setDesincorporacion(desincorporacion);
                }
                desincorporacion.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_ResolucionPai.getDesincorporacionFecha()));
                desincorporacion.setRazon(fF_ResolucionPai.getDesincorporacionRazon());
                s.saveOrUpdate(desincorporacion);
            } else if (fF_ResolucionPai.getDesincorporacionRazon().equals("") && (desincorporacion != null)) {
                resolucion.setDesincorporacion(null);
                s.delete(desincorporacion);
            }

            // Limpio el formulario
            fF_ResolucionPai.reset(mapping, request);
            // Limpio la session de hibernate
            s.flush();
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ModificarResolucionPAI.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_ModificarProfesorPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_ModificarProfesorPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_DatosProfesor fF_DatosProfesor = (F_DatosProfesor)form;
            /* Comienza nuestro codigo */
            String idProf = (String) request.getParameter("idProf");
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));
            
            /* Set de Datos Personales del Profesor */
            prof.setPrimerNombre(fF_DatosProfesor.getPrimerNombre());
            prof.setSegundoNombre(fF_DatosProfesor.getSegundoNombre());
            prof.setPrimerApellido(fF_DatosProfesor.getPrimerApellido());
            prof.setSegundoApellido(fF_DatosProfesor.getSegundoApellido());
            prof.setCi(fF_DatosProfesor.getCi());
            prof.setFec_Nac(new ve.usb.cohesion.runtime.LocalDate(fF_DatosProfesor.getFecha_Nacimiento()));
            prof.setCorreo(fF_DatosProfesor.getCorreo());

            /* Set de Datos Laborales del Profesor en la USB */
            prof.setFec_Ing_USB(new ve.usb.cohesion.runtime.LocalDate(fF_DatosProfesor.getFecha_Ingreso_USB()));
            prof.setFec_Renuncia(new ve.usb.cohesion.runtime.LocalDate(fF_DatosProfesor.getFecha_Renuncia_USB()));
            prof.setCategoria(fF_DatosProfesor.getCategoria());
            prof.setDivision(fF_DatosProfesor.getDivision());
            prof.setDepartamento(fF_DatosProfesor.getDepartamento());
            prof.setNovel(fF_DatosProfesor.getNovel());

            s.update(prof);
            s.flush();
            fF_DatosProfesor.reset(mapping, request);
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ModificarProfesorPAI.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_ObservacionesPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_ObservacionesPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP
            if (!CohesionActor.checkActor(request, 10)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_Observacion fF_Observacion = (F_Observacion)form;
            /* Comienza nuestro codigo */
            String idProf = (String) request.getParameter("idProf");
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));

            Pai paiActivo = prof.getPaiActivo();

            Observacion_Pai obs = new Observacion_Pai();
            obs.setPai(paiActivo);
            obs.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_Observacion.getFechaObservacion()));
            obs.setTexto(fF_Observacion.getNuevaObservacion());
            s.save(obs);
            s.flush();
            fF_Observacion.reset(mapping, request);
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_ObservacionesPAI.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_ConsultaAvanzadaPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_ConsultaAvanzadaPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_ConsultaAvanzadaPAI", "A_Pre_BuscarProfesorPAI", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP, administrador
            if (!CohesionActor.checkActor(request, 11)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /* Comienza nuestro codigo */
            String idProf = (String) request.getAttribute("idProf");
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));

            Pai paiActivo = prof.getPaiActivo();
            if (paiActivo != null) {

                String query = "SELECT estudio FROM PaiEstudio estudio, PaiResolucion resol " +
                        "WHERE estudio.resolucion = resol.idResolucion AND " +
                        "resol.pai = " + paiActivo.getIdPai() + " AND " +
                        // Selecciono la ultima resolucion con algun estudio asociado
                        "resol.fec_Resolucion = (SELECT MAX(resAux.fec_Resolucion) " +
                        "                        FROM PaiResolucion resAux, PaiEstudio estudAux " +
                        "                        WHERE resAux.pai = " + paiActivo.getIdPai() + " AND " +
                        "                            resAux.idResolucion = estudAux.resolucion" +
                        "                       )";
                PaiEstudio estudio = (PaiEstudio) s.createQuery(query).list().get(0);

                query = "SELECT perRem FROM PaiPermisoRemunerado perRem, PaiResolucion resol " +
                        "WHERE perRem.resolucion = resol.idResolucion AND " +
                        "resol.pai = " + paiActivo.getIdPai() + " " +
                        "ORDER BY resol.fec_Resolucion DESC";
                List<PaiPermisoRemunerado> L_PerRem = s.createQuery(query).list();

                query = "SELECT perNoRem FROM PaiPermisoNoRemunerado perNoRem, PaiResolucion resol " +
                        "WHERE perNoRem.resolucion = resol.idResolucion AND " +
                        "resol.pai = " + paiActivo.getIdPai() + " " +
                        "ORDER BY resol.fec_Resolucion DESC";
                List<PaiPermisoNoRemunerado> L_PerNoRem = s.createQuery(query).list();

                query = "SELECT pago FROM PaiPago pago " +
                        "WHERE pago.pai = " + paiActivo.getIdPai() + " " +
                        "ORDER BY pago.fecha";
                List<PaiPago> L_Pago = s.createQuery(query).list();
                query = "SELECT moneda, sum(monto) FROM PaiPago " +
                        "WHERE pai = " + paiActivo.getIdPai() + " " +
                        "GROUP BY moneda";
                List<String[]> L_Totales = s.createSQLQuery(query).list();

                query = "SELECT res FROM PaiResolucion res " +
                        "WHERE res.pai = " + paiActivo.getIdPai() + " " +
                        "ORDER BY res.fec_Resolucion DESC";
                List<PaiResolucion> L_Resoluciones = s.createQuery(query).list();

                List<String[]> L_Otros = new ArrayList<String[]>();
                for (int i = 0; i < L_Resoluciones.size(); i++) {
                    if (L_Resoluciones.get(i).getEstudio() != null) {
                        PaiEstudio estAux = L_Resoluciones.get(i).getEstudio();
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        otro[1] = "Se realizó un cambio en los Datos del Estudio," +
                                " a la Universidad: " + estAux.getUniversidad() + "," +
                                " País: " + estAux.getPais() + "," +
                                " Nivel de Estudio: " + estAux.getNivel() + "," +
                                " Modalidad de Estudio: " + estAux.getModalidad() + "," +
                                " Nombre del Estudio: " + estAux.getNombre_Estudio() + "," +
                                " y Periodo de Duración: " + estAux.getFec_Ini().toString() + " - " + estAux.getFec_Fin().toString() + "." +
                                " En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                    if (L_Resoluciones.get(i).getApoderado() != null) {
                        PaiApoderado apodAux = L_Resoluciones.get(i).getApoderado();
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        otro[1] = "Se realizó un cambio en los Datos del Apoderado," +
                                " Nombres: " + apodAux.getNombre() + ", " +
                                " Apellidos: " + apodAux.getApellido() + ", " +
                                " CI: " + Integer.toString(apodAux.getCi()) + ", " +
                                " Teléfono: " + apodAux.getTelefono() + ", " +
                                " y Correo: " + apodAux.getCorreo() + "." +
                                " En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                    if (!L_Resoluciones.get(i).getSet_Estatus().isEmpty()) {
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        otro[1] = "Se actualizó el Estatus del profesor:";
                        for (PaiEstatus _estAux : L_Resoluciones.get(i).getSet_Estatus()) {
                            otro[1] += " " + _estAux.getNombre();
                        }
                        otro[1] += ". En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                    if (L_Resoluciones.get(i).getProrroga() != null) {
                        PaiProrroga proAux = L_Resoluciones.get(i).getProrroga();
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        if (proAux.getOtorgado()) {
                            otro[1] = "Se otorgó una Prorroga al profesor,";
                        } else {
                            otro[1] = "El profesor solicitó una Prorroga,";
                        }
                        otro[1] += " para el periodo: " + proAux.getFec_Ini().toString() +
                                " - " + proAux.getFec_Fin().toString();
                        otro[1] += ". En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                    if (L_Resoluciones.get(i).getReintegro() != null) {
                        PaiReintegro reintAux = L_Resoluciones.get(i).getReintegro();
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        otro[1] = "Se realizó un cambio en la fecha de Reintegro del profesor a la USB," +
                                " para el día " +reintAux.getFec_reintegro().toString();
                        otro[1] += ". En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                    if (L_Resoluciones.get(i).getRenunciaManutencion() != null) {
                        PaiRenunciaManutencion renunAux = L_Resoluciones.get(i).getRenunciaManutencion();
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        otro[1] = "El profesor Reunció a la Manutención por la USB" +
                                " de " + renunAux.getMonto_Anterior() + " " + renunAux.getMoneda_Anterior() + "," +
                                " y se establecio en " + renunAux.getNuevo_Monto() + " " + renunAux.getNueva_Moneda();
                        otro[1] += ". En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                    if (L_Resoluciones.get(i).getDesincorporacion() != null) {
                        PaiDesincorporacion desAux = L_Resoluciones.get(i).getDesincorporacion();
                        String[] otro = new String[2];
                        otro[0] = L_Resoluciones.get(i).getFec_Resolucion().toString();
                        otro[1] = "El profesor se Desincorpora del PAI," +
                                " el día " + desAux.getFecha().toString() +
                                " por la razón: " + desAux.getRazon();
                        otro[1] += ". En la resolución: " + L_Resoluciones.get(i).getNum_Resolucion() + ".";
                        L_Otros.add(otro);
                    }
                }

                request.getSession().setAttribute("Profesor", prof);
                request.getSession().setAttribute("Estudio", estudio);
                request.getSession().setAttribute("L_PerRem", L_PerRem);
                request.getSession().setAttribute("L_PerNoRem", L_PerNoRem);
                request.getSession().setAttribute("L_Pago", L_Pago);
                request.getSession().setAttribute("L_Totales", L_Totales);
                request.getSession().setAttribute("L_Otros", L_Otros);

                String titulo = "PAI - Consulta Avanzada del profesor "
                        + prof.getPrimerNombre() + " " + prof.getSegundoNombre() + " "
                        + prof.getPrimerApellido() + " " + prof.getSegundoApellido();
                ByteArrayOutputStream baosPDF = contruirPDFConsultaAvanzada(titulo,
                        prof, estudio, L_PerRem, L_PerNoRem, L_Pago, L_Totales, L_Otros);
                request.getSession().setAttribute("nombrePDF", titulo + ".pdf");
                request.getSession().setAttribute("baosPDF", baosPDF);

            } else {
                salida = SALIDA_1;
                request.setAttribute("vengoDe", "CONSULTA_AVANZADA");
            }
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_ConsultaAvanzadaPAI.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_RegistrarPagoPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_RegistrarPagoPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_RegistrarPagoPAI", "A_Pre_BuscarProfesorPAI", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /* Comienza nuestro codigo */
            String idProf = (String) request.getAttribute("idProf");
            Profesor prof = (Profesor) s.load(Profesor.class, Long.parseLong(idProf));

            Pai paiActivo = prof.getPaiActivo();
            if (paiActivo != null) {
                request.setAttribute("idPai", Long.toString(paiActivo.getIdPai()));

                String query = "SELECT estudio FROM PaiEstudio estudio, PaiResolucion resol " +
                        "WHERE estudio.resolucion = resol.idResolucion AND " +
                        "resol.pai = " + paiActivo.getIdPai() + " AND " +
                        // Selecciono la ultima resolucion con algun estudio asociado
                        "resol.fec_Resolucion = (SELECT MAX(resAux.fec_Resolucion) " +
                        "                        FROM PaiResolucion resAux, PaiEstudio estudAux " +
                        "                        WHERE resAux.pai = " + paiActivo.getIdPai() + " AND " +
                        "                            resAux.idResolucion = estudAux.resolucion" +
                        "                       )";
                PaiEstudio estudio = (PaiEstudio) s.createQuery(query).list().get(0);
                
                request.setAttribute("Profesor", prof);
                request.setAttribute("Estudio", estudio);

            } else {
                salida = SALIDA_1;
                request.setAttribute("vengoDe", "REGISTRAR_PAGO");
            }
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_RegistrarPagoPAI.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_RegistrarPagoPAI.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_RegistrarPagoPAI(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"A_Pre_PAI", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_pai, director_DDP, administrador
            if (!CohesionActor.checkActor(request, 11)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_Pago_PAI fF_Pago_PAI = (F_Pago_PAI)form;
            /* Comienza nuestro codigo */
            String idPai = (String) request.getParameter("idPai");
            Pai paiActivo = (Pai) s.load(Pai.class, Long.parseLong(idPai));

            PaiPago pago = new PaiPago();
            pago.setPuntoDeCuenta(fF_Pago_PAI.getPuntoDeCuenta());
            pago.setConcepto(fF_Pago_PAI.getConcepto());
            pago.setMonto(Integer.parseInt(fF_Pago_PAI.getMonto()));
            pago.setMoneda(fF_Pago_PAI.getMoneda());
            pago.setFecha(new ve.usb.cohesion.runtime.LocalDate(fF_Pago_PAI.getFecha()));
            paiActivo.addToSet_Pago(pago);

            s.save(pago);
            s.saveOrUpdate(paiActivo);
            fF_Pago_PAI.reset(mapping, request);
            /* Termina nuestro codigo */
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==0) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_RegistrarPagoPAI.msg0"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

    public void A_PDFConsultaAvanzadaPAI(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        String nombrePDF = (String) request.getSession().getAttribute("nombrePDF");
        ByteArrayOutputStream baosPDF = (ByteArrayOutputStream) request.getSession().getAttribute("baosPDF");

        // Le indico al Servlet que voy a enviar un archivo pdf
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", " attachment; filename=\"" + nombrePDF + "\"");

        baosPDF.writeTo(response.getOutputStream());
    }

    private ByteArrayOutputStream contruirPDFConsultaAvanzada(String titulo,
            Profesor prof, PaiEstudio estudio, List<PaiPermisoRemunerado> L_PerRem,
            List<PaiPermisoNoRemunerado> L_PerNoRem, List<PaiPago> L_Pago,
            List<String[]> L_Totales, List<String[]> L_Otros) throws Exception {

        // Nuevo documento PDF con la pagina horizontal
        Document document = new Document(PageSize.LETTER.rotate());
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baosPDF);

        document.open();

        //Seteo de la cebolla
        URL base = this.getClass().getResource("");
        String path = new File(base.getFile(), "/../../../../../css/images/Cebolla001tr.gif").getCanonicalPath();
        GifImage img = new GifImage(path);
        int frame_count = img.getFrameCount();
        for (int i = 1; i <= frame_count; i++) {
            document.add(img.getImage(i));
        }
        //Seteo Membrete
        document.add(new Paragraph("Universidad Simón Bolívar\nDepartamento de Desarrollo Profesoral\n"
                + "Programa Actualización Académica"));

        //Seteo el titulo y lo agrego al documento
        Paragraph title = new Paragraph(titulo, FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
        title.setAlignment(Element.ALIGN_CENTER);
        title.setSpacingAfter(25);
        document.add(title);

        document.add(new Paragraph("Datos Actuales del Profesor y del Estudio", FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD)));
        String datosActuales = "Profesor: " + prof.getPrimerApellido() + " " + prof.getSegundoApellido() + " "
                + prof.getPrimerNombre() + " " + prof.getSegundoNombre() + " " + "CI: " + prof.getCi() + "\n"
                + "División: " + prof.getDivision() + "\n"
                + "Departamento: " + prof.getDepartamento() + "\n"
                + "Nombre del Estudio: " + estudio.getNombre_Estudio() + "\n"
                + "Período de Duración del Estudio, Inicio: " + estudio.getFec_Ini() + " Fin: " + estudio.getFec_Fin() + "\n"
                + "Universidad: " + estudio.getUniversidad() + "\n"
                + "País: " + estudio.getPais() + "\n"
                + "Modalidad: " + estudio.getModalidad();
        document.add(new Paragraph(datosActuales));

        document.add(new Paragraph("Permisos No Remunerados", FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD)));
        //Creo la tabla
        PdfPTable table = new PdfPTable(2);
        table.setWidthPercentage(90);
        table.setSpacingBefore(15);
        float[] anchos = new float[2];
        anchos[0] = 22;
        anchos[1] = 72;
        table.setWidths(anchos);
        table.addCell("Lapso");
        table.addCell("Descripción");
        //Agrego los datos a la tabla
        for (PaiPermisoNoRemunerado perNoRem : L_PerNoRem) {
            table.addCell(perNoRem.getFec_Inicio() + " - " + perNoRem.getFec_Vencimiento());
            table.addCell(perNoRem.getDescripcion());
        }
        document.add(table);
        if (L_PerNoRem.isEmpty()) {
            document.add(new Paragraph("No existen permisos no remunerados asociados al profesor."));
        }

        document.add(new Paragraph("Permisos Remunerados", FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD)));
        //Creo la tabla
        PdfPTable table2 = new PdfPTable(2);
        table2.setWidthPercentage(90);
        table2.setSpacingBefore(15);
        float[] anchos2 = new float[2];
        anchos2[0] = 22;
        anchos2[1] = 72;
        table2.setWidths(anchos2);
        table2.addCell("Lapso");
        table2.addCell("Descripción");
        //Agrego los datos a la tabla
        for (PaiPermisoRemunerado perRem : L_PerRem) {
            table2.addCell(perRem.getFechaInicio() + " - " + perRem.getFechaFin());
            table2.addCell(perRem.getDescripcion());
        }
        document.add(table2);
        if (L_PerRem.isEmpty()) {
            document.add(new Paragraph("No existen permisos remunerados asociados al profesor."));
        }

        document.add(new Paragraph("Pagos a Favor del Profesor", FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD)));
        //Creo la tabla
        PdfPTable table3 = new PdfPTable(5);
        table3.setWidthPercentage(90);
        table3.setSpacingBefore(15);
        float[] anchos3 = new float[5];
        anchos3[0] = 20;
        anchos3[1] = 12;
        anchos3[2] = 48;
        anchos3[3] = 8;
        anchos3[4] = 12;
        table3.setWidths(anchos3);
        table3.addCell("Punto de Cuenta");
        table3.addCell("Fecha");
        table3.addCell("Concepto");
        table3.addCell("Monto");
        table3.addCell("Moneda");
        //Agrego los datos a la tabla
        for (PaiPago pago : L_Pago) {
            table3.addCell(pago.getPuntoDeCuenta());
            table3.addCell(pago.getFecha().toString());
            table3.addCell(pago.getConcepto());
            table3.addCell(String.valueOf(pago.getMonto()));
            table3.addCell(pago.getMoneda());
        }
        document.add(table3);
        if (L_Pago.isEmpty()) {
            document.add(new Paragraph("No existen pagos asociados al profesor."));
        }
        for (Object[] total : L_Totales) {
            document.add(new Paragraph("Total " + total[0].toString() + ": " + total[1].toString()));
        }

        document.add(new Paragraph("Otros", FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD)));
        //Creo la tabla
        PdfPTable table4 = new PdfPTable(2);
        table4.setWidthPercentage(90);
        table4.setSpacingBefore(15);
        float[] anchos4 = new float[2];
        anchos4[0] = 12;
        anchos4[1] = 82;
        table4.setWidths(anchos4);
        table4.addCell("Fecha");
        table4.addCell("Descripción");
        //Agrego los datos a la tabla
        for (Object[] otro : L_Otros) {
            table4.addCell(otro[0].toString());
            table4.addCell(otro[1].toString());
        }
        document.add(table4);
        if (L_PerRem.isEmpty()) {
            document.add(new Paragraph("No existen otros cambios asociados al profesor."));
        }

        document.close();

        return baosPDF;
    }

}